本篇將完成:
現在我們已經有了基本的後台,
編輯刪除文章的權限也都設定完成了,
但,我們沒有admin的user呀!
第一個可以直接在rails c改出第一個,或者是從seed裡面去做一個出來,
總不能以後要新增管理員或變更權限都得找工程師進去server裡面改,
所以我們要讓後台有能更新使用者權限的地方。
在開始說要做什麼之前,我們先說不能做什麼,
答案就是不能讓admin拔掉自己的admin權限,
因為使用者是邪惡的XD他們總在過奇怪的事情,
根據我的經驗把這個權限拔掉多出來的問題會比不拔少很多。
OK,接著就開始吧!
前面有說過更改權限是藉著users table中的admin column去做到的,
跟資料表操作有關的想到model就對了,
這裡有兩種做法
=> 這樣就浪費了boolean特性,我個人偏愛第二種,因為要多寫一個method很不方便。
=> 就是用神奇的 !
符號。(這個我們不念驚嘆號,念bang!)
我們會新增一個繼承自user的model,(記得前一篇說的前後檯model分開嗎?)
class Admin::User < User
def toggle_admin!
self.admin = !self.admin
end
end
model準備好之後,我們往controller出發。
先把routes加上去
namespace :admin do
resources :posts
resources :users do
collection do
put :toggle_admin
end
end
end
如果你是要對單個resource做操作就用member,對多個操作就使用collection,
看不懂這行在說什麼可以執行rake routes測試一下,
在member底下的就會鎖定user的id(因為他是要對每個user作用),
而在collection底下則是直接接在users後面。
搞定之後我們先到view去。
其實如果熟html的話這裡可以直接跳過。
<%= form_tag(toggle_admin_admin_users_path, method: :put) do %>
譯者
身份
文章數
<% @admin_users.each do |user| %>
<% unless user.id == current_user.id %>
<%= check_box_tag "user_ids[]", user.id %>
<% end %>
<%= user.name %>
<%= render_user_role(user) %>
<%= user.posts.count %>
<% end %>
<%= submit_tag "變更使用者權限" %>
<% end -%>
最重要的就是這行<%= check\_box\_tag "user\_ids[]", user.id %>
,
到時候params[:user_ids]就可以拿到所有有勾選的user id,
而使用Admin::User.find(params[:user_ids])能一次拿出多個admin_users。
(不過params裡面的是字串,要記得將它轉成integer才能去對應id)
所以我們只要把每個拿出來的user都執行一次我們剛剛在admin_user.rb裡新增的方法就可以了!
class Admin::UsersController < AdminController
def index
@admin_users = Admin::User.all
end
def toggle_admin
params[:user_ids] = params[:user_ids].map{|i| i.to_i}
@admin_users = Admin::User.find(params[:user_ids])
@admin_users.each do |user|
user.toggle_admin!
user.save
end
redirect_to admin_users_path
end
end
應該會有更好的寫法,這裡只是簡單舉個例子XD
其實只要懂html和ruby基本語法就可以做很多事情了,
Rails就是這麼神奇!
下一篇,也是後台功能的最後一篇將完成: